package javaapplication9;
import org.jgap.Chromosome;
import org.jgap.IChromosome;
import org.jgap.FitnessFunction;

public class fittnessRuta extends FitnessFunction
{
    private int destino_x;
    private int destino_y;
    private int origen_x;
    private int origen_y;

    public fittnessRuta( int origX, int origY, int desX, int desY )
    {
        origen_x = origX;
        origen_y = origY;
        destino_x = desX;
        destino_y = desY;
    }

    public double evaluate( IChromosome a_subject )
    {
        String ruta = getCadena(a_subject);
        int penalizacion_ruta = getPenalizacionRuta(ruta);

        // Codigo para penalizacion Gasolina-tiempo

        //

        double fitness = ( 1000 - penalizacion_ruta );
        //System.out.println(ruta);
        return fitness;
    }

    public static String getCadena(IChromosome cromosoma) {
        String result = "";

        int length = cromosoma.size();
        for (int i = 0; i < length; i++) {
            result += (String) cromosoma.getGene(i).getAllele();
        }

        return result;
    }

    public int getPenalizacionRuta(String ruta) {
        int suma_x = origen_x;
        int suma_y = origen_y;
        int tamano = ruta.length();
        for(int i = 0; i < tamano; i++) {
            char paso = ruta.charAt(i);
            switch (paso) {
                case 'A':
                    suma_x++;
                    break;
                case 'B':
                    suma_y++;
                    break;
                case 'C':
                    suma_x--;
                    break;
                case 'D':
                    suma_y--;
                    break;
            }
        }
        //int diferencia_real_x = destino_x - origen_x;
        //int diferencia_real_y = destino_y - origen_y;
        //int diferencia_potencial_solucion_x = suma_x - origen_x;
        //int diferencia_potencial_solucion_y = suma_y - origen_y;
        int diferencia_real_potencial_x = destino_x - suma_x;
        int diferencia_real_potencial_y = destino_y - suma_y;
        int penalizacion = Math.abs(diferencia_real_potencial_x) + Math.abs(diferencia_real_potencial_y);
        penalizacion += tamano;
        return penalizacion;

    }
}
